package de.hm.edu.kinderfinder.contentprovider;

import java.util.ArrayList;
import java.util.List;

import de.hm.edu.kinderfinder.pojos.ZoneObject;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

/**
 * Diese Komponente ist dafür verantwortlich Daten für die Acitivies in
 * einer Datenbank abzulegen und wieder verfügbar zu machen
 * 
 * @author Lukas Jarosch, Christoph-Samuel Pitter
 * 
 */
public class DataBaseManager {

	private SQLiteDatabase mDatenbank;
	private DataBase cacheData;
	private static DataBaseManager instance;

	/**
	 * Konstruktor für den DatabaseManager. Initialisiert die Datenbank und
	 * speichert eine beschreibare Version
	 * 
	 * @param context
	 *            der aufrufenden Activity
	 */
	private DataBaseManager(Context context) {
		cacheData = new DataBase(context);
		mDatenbank = cacheData.getWritableDatabase();
	}

	private DataBaseManager() {

	}

	public static DataBaseManager getInstance(Context context) {
		if (instance == null) {
			instance = new DataBaseManager(context);
			return instance;
		} else
			return instance;
	}

	/**
	 * Diese Methode fügt ein weiteres Zonenobjekt in die Datenbank hinzu.
	 * 
	 * @param zone
	 *            Die Zonedaten die hinterlegt werden sollen
	 */
	public void insertZoneIntoDB(ZoneObject zone) {

		ContentValues values = new ContentValues();

		values.put(DataBase.ZONENAME, zone.getZonename());
		values.put(DataBase.LATITUDE, zone.getLatitude());
		values.put(DataBase.LONGITUDE, zone.getLongitude());
		values.put(DataBase.RADIUS, zone.getRadius());
		values.put(DataBase.TIMEEND, zone.getTimeEnd());
		values.put(DataBase.TIMESTART, zone.getTimeStart());
		values.put(DataBase.MONDAY, zone.isMonday() ? 1 : 0);
		values.put(DataBase.TUESDAY, zone.isTuesday() ? 1 : 0);
		values.put(DataBase.WEDNESDAY, zone.isWednesday() ? 1 : 0);
		values.put(DataBase.THURSDAY, zone.isThursday() ? 1 : 0);
		values.put(DataBase.FRIDAY, zone.isFriday() ? 1 : 0);
		values.put(DataBase.SATURDAY, zone.isSaturday() ? 1 : 0);
		values.put(DataBase.SUNDAY, zone.isSunday() ? 1 : 0);

		Log.i("DB", "insert " + DataBase.ZONENAME + "  _ " + zone.getZonename());

		mDatenbank.insert(DataBase.TABLE_NAME, null, values);
	}

	/**
	 * Dies Methode fügt Zeitparameter zu einer schon vorhandenen Zone hinzu.
	 * 
	 * @param zone
	 *            enthölt die Informationen welche Zone aktualisiert werden
	 *            soll und um welche Zeitparameter. TODO: Testen
	 */
	public void addTimeValuesToZone(ZoneObject zone) {

		ContentValues values = new ContentValues();

		values.put(DataBase.TIMEEND, zone.getTimeEnd());
		values.put(DataBase.TIMESTART, zone.getTimeStart());
		values.put(DataBase.MONDAY, zone.isMonday() ? 1 : 0);
		values.put(DataBase.TUESDAY, zone.isTuesday() ? 1 : 0);
		values.put(DataBase.WEDNESDAY, zone.isWednesday() ? 1 : 0);
		values.put(DataBase.THURSDAY, zone.isThursday() ? 1 : 0);
		values.put(DataBase.FRIDAY, zone.isFriday() ? 1 : 0);
		values.put(DataBase.SATURDAY, zone.isSaturday() ? 1 : 0);
		values.put(DataBase.SUNDAY, zone.isSunday() ? 1 : 0);

		int i = mDatenbank.update(DataBase.TABLE_NAME, values,
				DataBase.ZONENAME + "=?",
				new String[] { String.valueOf(zone.getZonename()) });
	}

	/**
	 * Diese Methode bezieht alle hinterlegten Zonenobjekte aus der Datenbank
	 * und gibt sie in einer Listenform an den Aufrufer
	 * 
	 * @return Die Liste mit allen verfügbaren Zonen.
	 */
	public List<ZoneObject> getZonesFromDB() {

		String sql = "SELECT *  FROM " + DataBase.TABLE_NAME + ";";
		List<ZoneObject> zones = new ArrayList<ZoneObject>();
		Cursor cursor = mDatenbank.rawQueryWithFactory(null, sql, null,
				DataBase.TABLE_NAME);

		while (cursor.moveToNext()) {
			ZoneObject data = new ZoneObject();
			Log.i("DB",
					"read " + DataBase.ZONENAME + "  _ " + cursor.getString(1));
			data.setZonename(cursor.getString(1));
			data.setLatitude(cursor.getFloat(2));
			data.setLongitude(cursor.getFloat(3));
			data.setRadius(cursor.getInt(4));
			data.setTimeStart(cursor.getLong(5));
			data.setTimeEnd(cursor.getLong(6));
			data.setMonday(cursor.getInt(7) == 1);
			data.setTuesday(cursor.getInt(8) == 1);
			data.setWednesday(cursor.getInt(9) == 1);
			data.setThursday(cursor.getInt(10) == 1);
			data.setFriday(cursor.getInt(11) == 1);
			data.setSaturday(cursor.getInt(12) == 1);
			data.setSunday(cursor.getInt(13) == 1);
			zones.add(data);
		}
		cursor.close();
		return zones;
	}

	public void resetDB() {
		cacheData.onUpgrade(mDatenbank, 0, 0);
	}

}
